// 系统方案
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define LOG "log.txt"

int main()
{
    umask(0); // 把权限设置为0
    // int fd = open(LOG, O_WRONLY | O_CREAT, 0666); // 以写的方式创建或打开文件，权限设置为666
    // int fd = open(LOG, O_WRONLY | O_CREAT | O_TRUNC, 0666);//清空上次的，写入
    // int fd = open(LOG, O_WRONLY | O_CREAT | O_APPEND, 0666);//追加
    int fd = open(LOG, O_RDONLY);
    if (fd == -1)
    {
        printf("fd: %d, errno: %d, errstring %s\n", fd, errno, strerror(errno));
    }
    else
        printf("fd: %d, errno: %d, errstring %s\n", fd, errno, strerror(errno));

    // printf("fd: %d\n",fd);

    // 读
    char buffer[50];
    // 这里我们无法做到按行读取，我们是整体读取的
    ssize_t n = read(fd, buffer, sizeof(buffer) - 1); // 使用系统接口来进行IO的时候，一定要注意\0问题
    if (n > 0)
    {
        buffer[n] = '\0';
        printf("%s\n", buffer);
    }

    // 写
    //  const char *msg = "aaaaaaaaaa";
    //  int cnt = 1;
    //  while (cnt)
    //  {
    //      char line[128];
    //      snprintf(line, sizeof(line), "%s, %d\n", msg, cnt);
    //      write(fd, line, strlen(line)); // 不用加1，因为\0是C语言的规定，不是文件的规定
    //      cnt--;
    //  }

    close(fd);
    return 0;
}

// 语言方案
//  #include <stdio.h>

// #define LOG "log.txt"

// int main()
// {
//     // w:默认写方式打开文件，如果文件不存在，就创建它
//     // 默认如果只是打开，文件内容会自动被清空
//     // 同时，每次进行写入的时候，都会从最开始进行写入
//     // FILE *fp = fopen(LOG, "w");

//     // a:不会清空文件，而是每一次写入都是从文件结尾写入的，追加
//     // FILE *fp = fopen(LOG, "a");
//     FILE *fp = fopen(LOG, "r");
//     if (fp == NULL)
//     {
//         perror("fopen");
//         return 1;
//     }

//     while(1)
//     {
//         char line[128];
//         if (fgets(line, sizeof(line), fp) == NULL)
//             break;
//         else
//             printf("%s", line);
//     }

//     // // const char *msg = "hello bite, hello 107";
//     // const char*msg="aaa\n";
//     // int cnt = 5;
//     // while (cnt)
//     // {
//     //     fputs(msg,fp);
//     //     // char buffer[256];
//     //     // snprintf(buffer,sizeof(buffer),"%s: %d:hxj\n",msg,cnt);
//     //     // fputs(buffer,fp);//格到缓冲区里，再打印到文件里
//     //     // printf("%s",buffer);//格到缓冲区里，再打印出来

//     //     // fprintf(fp, "%s: %d: hxj\n", msg, cnt);//向文件写

//     //     // fprintf(stdout, "%s: %d: hxj\n", msg, cnt);//向显示器写
//     //     // fputs(msg,fp);
//     //     cnt--;
//     // }

//     fclose(fp);
//     return 0;
// }